library(baseballr)
library(kableExtra)
library(ggplot2)
library(tidyverse)
PitcherData=scrape_statcast_savant_pitcher_all("2019-04-01", "2019-05-27")
## 2019-04-01 is not a date. Attempting to coerce...
## No playerid specified. Collecting data for all batters/pitchers.
## https://baseballsavant.mlb.com/statcast_search/csv?all=true&hfPT=&hfAB=&hfBBT=&hfPR=&hfZ=&stadium=&hfBBL=&hfNewZones=&hfGT=R%7CPO%7CS%7C&hfC&hfSea=2019%7C&hfSit=&hfOuts=&opponent=&pitcher_throws=&batter_stands=&hfSA=&player_type=pitcher&hfInfield=&team=&position=&hfOutfield=&hfRO=&home_road=&game_date_gt=2019-04-01&game_date_lt=2019-05-27&hfFlag=&hfPull=&metric_1=&hfInn=&min_pitches=0&min_results=0&group_by=name&sort_col=pitches&player_event_sort=h_launch_speed&sort_order=desc&min_abs=0&type=details
## These data are from BaseballSavant and are property of MLB Advanced Media, L.P. All rights reserved.
## Grabbing data, this may take a minute...
## URL read and payload acquired successfully.
Williams=scrape_statcast_savant_pitcher_all("2019-04-01","2019-09-30", playerid=592866)
## 2019-04-01 is not a date. Attempting to coerce...
## https://baseballsavant.mlb.com/statcast_search/csv?all=true&hfPT=&hfAB=&hfBBT=&hfPR=&hfZ=&stadium=&hfBBL=&hfNewZones=&hfGT=R%7CPO%7CS%7C&hfC&hfSea=2019%7C&hfSit=&hfOuts=&opponent=&pitcher_throws=&batter_stands=&hfSA=&player_type=pitcher&hfInfield=&team=&position=&hfOutfield=&hfRO=&home_road=&pitchers_lookup%5B%5D=592866&game_date_gt=2019-04-01&game_date_lt=2019-09-30&hfFlag=&hfPull=&metric_1=&hfInn=&min_pitches=0&min_results=0&group_by=name&sort_col=pitches&player_event_sort=h_launch_speed&sort_order=desc&min_abs=0&type=details
## These data are from BaseballSavant and are property of MLB Advanced Media, L.P. All rights reserved.
## Grabbing data, this may take a minute...
## URL read and payload acquired successfully.
Musgrove=scrape_statcast_savant_pitcher_all("2019-04-01","2019-09-30", playerid=605397)
## 2019-04-01 is not a date. Attempting to coerce...
## https://baseballsavant.mlb.com/statcast_search/csv?all=true&hfPT=&hfAB=&hfBBT=&hfPR=&hfZ=&stadium=&hfBBL=&hfNewZones=&hfGT=R%7CPO%7CS%7C&hfC&hfSea=2019%7C&hfSit=&hfOuts=&opponent=&pitcher_throws=&batter_stands=&hfSA=&player_type=pitcher&hfInfield=&team=&position=&hfOutfield=&hfRO=&home_road=&pitchers_lookup%5B%5D=605397&game_date_gt=2019-04-01&game_date_lt=2019-09-30&hfFlag=&hfPull=&metric_1=&hfInn=&min_pitches=0&min_results=0&group_by=name&sort_col=pitches&player_event_sort=h_launch_speed&sort_order=desc&min_abs=0&type=details
## These data are from BaseballSavant and are property of MLB Advanced Media, L.P. All rights reserved.
## Grabbing data, this may take a minute...
## URL read and payload acquired successfully.
Archer=scrape_statcast_savant_pitcher_all("2019-04-01","2019-09-30", playerid=502042)
## 2019-04-01 is not a date. Attempting to coerce...
## https://baseballsavant.mlb.com/statcast_search/csv?all=true&hfPT=&hfAB=&hfBBT=&hfPR=&hfZ=&stadium=&hfBBL=&hfNewZones=&hfGT=R%7CPO%7CS%7C&hfC&hfSea=2019%7C&hfSit=&hfOuts=&opponent=&pitcher_throws=&batter_stands=&hfSA=&player_type=pitcher&hfInfield=&team=&position=&hfOutfield=&hfRO=&home_road=&pitchers_lookup%5B%5D=502042&game_date_gt=2019-04-01&game_date_lt=2019-09-30&hfFlag=&hfPull=&metric_1=&hfInn=&min_pitches=0&min_results=0&group_by=name&sort_col=pitches&player_event_sort=h_launch_speed&sort_order=desc&min_abs=0&type=details
## These data are from BaseballSavant and are property of MLB Advanced Media, L.P. All rights reserved.
## Grabbing data, this may take a minute...
## URL read and payload acquired successfully.
Brault=scrape_statcast_savant_pitcher_all("2019-04-01","2019-09-30", playerid=643230)
## 2019-04-01 is not a date. Attempting to coerce...
## https://baseballsavant.mlb.com/statcast_search/csv?all=true&hfPT=&hfAB=&hfBBT=&hfPR=&hfZ=&stadium=&hfBBL=&hfNewZones=&hfGT=R%7CPO%7CS%7C&hfC&hfSea=2019%7C&hfSit=&hfOuts=&opponent=&pitcher_throws=&batter_stands=&hfSA=&player_type=pitcher&hfInfield=&team=&position=&hfOutfield=&hfRO=&home_road=&pitchers_lookup%5B%5D=643230&game_date_gt=2019-04-01&game_date_lt=2019-09-30&hfFlag=&hfPull=&metric_1=&hfInn=&min_pitches=0&min_results=0&group_by=name&sort_col=pitches&player_event_sort=h_launch_speed&sort_order=desc&min_abs=0&type=details
## These data are from BaseballSavant and are property of MLB Advanced Media, L.P. All rights reserved.
## Grabbing data, this may take a minute...
## URL read and payload acquired successfully.
Keller=scrape_statcast_savant_pitcher_all("2019-04-01","2019-09-30", playerid=656605)
## 2019-04-01 is not a date. Attempting to coerce...
## https://baseballsavant.mlb.com/statcast_search/csv?all=true&hfPT=&hfAB=&hfBBT=&hfPR=&hfZ=&stadium=&hfBBL=&hfNewZones=&hfGT=R%7CPO%7CS%7C&hfC&hfSea=2019%7C&hfSit=&hfOuts=&opponent=&pitcher_throws=&batter_stands=&hfSA=&player_type=pitcher&hfInfield=&team=&position=&hfOutfield=&hfRO=&home_road=&pitchers_lookup%5B%5D=656605&game_date_gt=2019-04-01&game_date_lt=2019-09-30&hfFlag=&hfPull=&metric_1=&hfInn=&min_pitches=0&min_results=0&group_by=name&sort_col=pitches&player_event_sort=h_launch_speed&sort_order=desc&min_abs=0&type=details
## These data are from BaseballSavant and are property of MLB Advanced Media, L.P. All rights reserved.
## Grabbing data, this may take a minute...
## URL read and payload acquired successfully.
Williams2019=Williams[,c(1,3,57,79)]
Musgrove2019=Musgrove[,c(1,3,57,79)]
Archer2019=Archer[,c(1,3,57,79)]
Brault2019=Brault[,c(1,3,57,79)]
Keller2019=Keller[,c(1,3,57,79)]
head(Williams2019)
Williams2019=na.omit(Williams2019)
unique(Williams2019$pitch_type)
## [1] "SI" "FF" "SL" "CH" "CU"
unique(Williams2019$pitch_name)
## [1] "Sinker" "4-Seam Fastball" "Slider" "Changeup"
## [5] "Curveball"
Williams2019SI=Williams2019 %>%filter(pitch_type=="SI")
WilliamsmeanSISpin=round(mean(Williams2019SI$release_spin_rate),2)
WilliamsmeanSIRel=round(mean(Williams2019SI$release_speed),2)
WilliamsmeanSISpin
## [1] 1939.53
WilliamsmeanSIRel
## [1] 89.64
Williams2019FF=Williams2019 %>%filter(pitch_type=="FF")
WilliamsmeanFFSpin=round(mean(Williams2019FF$release_spin_rate),2)
WilliamsmeanFFRel=round(mean(Williams2019FF$release_speed),2)
WilliamsmeanFFSpin
## [1] 2205.29
WilliamsmeanFFRel
## [1] 91.75
Williams2019SL=Williams2019 %>%filter(pitch_type=="SL")
WilliamsmeanSLSpin=round(mean(Williams2019SL$release_spin_rate),2)
WilliamsmeanSLRel=round(mean(Williams2019SL$release_speed),2)
WilliamsmeanSLSpin
## [1] 2202.3
WilliamsmeanSLRel
## [1] 83.02
Williams2019CU=Williams2019 %>%filter(pitch_type=="CU")
WilliamsmeanCUSpin=round(mean(Williams2019CU$release_spin_rate),2)
WilliamsmeanCURel=round(mean(Williams2019CU$release_speed),2)
WilliamsmeanCUSpin
## [1] 2270.18
WilliamsmeanCURel
## [1] 76.75
Williams2019CH=Williams2019 %>%filter(pitch_type=="CH")
WilliamsmeanCHSpin=round(mean(Williams2019CH$release_spin_rate),2)
WilliamsmeanCHRel=round(mean(Williams2019CH$release_speed),2)
WilliamsmeanCHSpin
## [1] 1819.29
WilliamsmeanCHRel
## [1] 83.66
pitchesWilliams=c(unique(Williams2019$pitch_type))
pitchesWilliams
## [1] "SI" "FF" "SL" "CH" "CU"
spinsWilliams=c(WilliamsmeanSISpin, WilliamsmeanFFSpin,WilliamsmeanSLSpin,WilliamsmeanCUSpin,WilliamsmeanCHSpin)
spinsWilliams
## [1] 1939.53 2205.29 2202.30 2270.18 1819.29
ReleaseSpeedWilliams=c(WilliamsmeanSIRel, WilliamsmeanFFRel, WilliamsmeanSLRel, WilliamsmeanCURel,WilliamsmeanCHRel)
ReleaseSpeedWilliams
## [1] 89.64 91.75 83.02 76.75 83.66
table1Williams<-data.frame(pitchesWilliams,spinsWilliams,ReleaseSpeedWilliams)
table1Williams
ggplot(data = table1Williams, aes(x=pitchesWilliams, y=spinsWilliams, fill = ReleaseSpeedWilliams)) +
geom_bar(stat = "identity") +
geom_label(aes(x = pitchesWilliams, y = spinsWilliams, label = spinsWilliams), hjust = .5, vjust = 0, colour = "black", fill = NA, label.size = NA, family="Helvetica", size = 4) +
xlab("Pitch Type") +
ylab("Spin Rate (RPM)") +
ggtitle("Trevor Williams Avg. Spin Rate and Release Speed by Pitch Type (2019)") +
coord_cartesian(ylim = c(0, 3200))

ggsave("TrevorWilliams.png")
## Saving 7 x 5 in image
head(Musgrove2019)
Musgrove2019=na.omit(Musgrove2019)
unique(Musgrove2019$pitch_type)
## [1] "CU" "FF" "SI" "SL" "CH" "FC"
unique(Musgrove2019$pitch_name)
## [1] "Curveball" "4-Seam Fastball" "Sinker" "Slider"
## [5] "Changeup" "Cutter"
Musgrove2019CU=Musgrove2019 %>%filter(pitch_type=="CU")
MusgrovemeanCUSpin=round(mean(Musgrove2019CU$release_spin_rate),2)
MusgrovemeanCURel=round(mean(Musgrove2019CU$release_speed),2)
MusgrovemeanCUSpin
## [1] 2573.59
MusgrovemeanCURel
## [1] 82.04
Musgrove2019FF=Musgrove2019 %>%filter(pitch_type=="FF")
MusgrovemeanFFSpin=round(mean(Musgrove2019FF$release_spin_rate),2)
MusgrovemeanFFRel=round(mean(Musgrove2019FF$release_speed),2)
MusgrovemeanFFSpin
## [1] 2418.3
MusgrovemeanFFRel
## [1] 92.74
Musgrove2019SI=Musgrove2019 %>%filter(pitch_type=="SI")
MusgrovemeanSISpin=round(mean(Musgrove2019SI$release_spin_rate),2)
MusgrovemeanSIRel=round(mean(Musgrove2019SI$release_speed),2)
MusgrovemeanSISpin
## [1] 2276.55
MusgrovemeanSIRel
## [1] 91.48
Musgrove2019SL=Musgrove2019 %>%filter(pitch_type=="SL")
MusgrovemeanSLSpin=round(mean(Musgrove2019SL$release_spin_rate),2)
MusgrovemeanSLRel=round(mean(Musgrove2019SL$release_speed),2)
MusgrovemeanSLSpin
## [1] 2494.72
MusgrovemeanSLRel
## [1] 83.21
Musgrove2019CH=Musgrove2019 %>%filter(pitch_type=="CH")
MusgrovemeanCHSpin=round(mean(Musgrove2019CH$release_spin_rate),2)
MusgrovemeanCHRel=round(mean(Musgrove2019CH$release_speed),2)
MusgrovemeanCHSpin
## [1] 1999.99
MusgrovemeanCHRel
## [1] 85.3
Musgrove2019FC=Musgrove2019 %>%filter(pitch_type=="FC")
MusgrovemeanFCSpin=round(mean(Musgrove2019FC$release_spin_rate),2)
MusgrovemeanFCRel=round(mean(Musgrove2019FC$release_speed),2)
MusgrovemeanFCSpin
## [1] 2513.58
MusgrovemeanFCRel
## [1] 88.76
pitchesMusgrove=c(unique(Musgrove2019$pitch_type))
pitchesMusgrove
## [1] "CU" "FF" "SI" "SL" "CH" "FC"
spinsMusgrove=c(MusgrovemeanCUSpin, MusgrovemeanFFSpin,MusgrovemeanSISpin,MusgrovemeanSLSpin,MusgrovemeanCHSpin, MusgrovemeanFCSpin)
spinsMusgrove
## [1] 2573.59 2418.30 2276.55 2494.72 1999.99 2513.58
ReleaseSpeedMusgrove=c(MusgrovemeanCURel, MusgrovemeanFFRel, MusgrovemeanSIRel, MusgrovemeanSLRel,MusgrovemeanCHRel, MusgrovemeanFCRel)
ReleaseSpeedMusgrove
## [1] 82.04 92.74 91.48 83.21 85.30 88.76
table1Musgrove<-data.frame(pitchesMusgrove,spinsMusgrove,ReleaseSpeedMusgrove)
table1Musgrove
ggplot(data = table1Musgrove, aes(x=pitchesMusgrove, y=spinsMusgrove, fill = ReleaseSpeedMusgrove)) +
geom_bar(stat = "identity") +
geom_label(aes(x = pitchesMusgrove, y = spinsMusgrove, label = spinsMusgrove), hjust = .5, vjust = 0, colour = "black", fill = NA, label.size = NA, family="Helvetica", size = 4) +
xlab("Pitch Type") +
ylab("Spin Rate (RPM)") +
ggtitle("Joe Musgrove Avg. Spin Rate and Release Speed by Pitch Type (2019)") +
coord_cartesian(ylim = c(0, 3200))

ggsave("JoeMusgrove.png")
## Saving 7 x 5 in image
head(Archer2019)
Archer2019=na.omit(Archer2019)
unique(Archer2019$pitch_type)
## [1] "SL" "FF" "CH" "CU" "FT"
unique(Archer2019$pitch_name)
## [1] "Slider" "4-Seam Fastball" "Changeup" "Curveball"
## [5] "2-Seam Fastball"
Archer2019SL=Archer2019 %>%filter(pitch_type=="SL")
ArchermeanSLSpin=round(mean(Archer2019SL$release_spin_rate),2)
ArchermeanSLRel=round(mean(Archer2019SL$release_speed),2)
ArchermeanSLSpin
## [1] 2613.44
ArchermeanSLRel
## [1] 88.76
Archer2019FF=Archer2019 %>%filter(pitch_type=="FF")
ArchermeanFFSpin=round(mean(Archer2019FF$release_spin_rate),2)
ArchermeanFFRel=round(mean(Archer2019FF$release_speed),2)
ArchermeanFFSpin
## [1] 2264.25
ArchermeanFFRel
## [1] 94.09
Archer2019CH=Archer2019 %>%filter(pitch_type=="CH")
ArchermeanCHSpin=round(mean(Archer2019CH$release_spin_rate),2)
ArchermeanCHRel=round(mean(Archer2019CH$release_speed),2)
ArchermeanCHSpin
## [1] 1641.94
ArchermeanCHRel
## [1] 87.67
Archer2019CU=Archer2019 %>%filter(pitch_type=="CU")
ArchermeanCUSpin=round(mean(Archer2019CU$release_spin_rate),2)
ArchermeanCURel=round(mean(Archer2019CU$release_speed),2)
ArchermeanCUSpin
## [1] 2676.07
ArchermeanCURel
## [1] 82.41
Archer2019FT=Archer2019 %>%filter(pitch_type=="FT")
ArchermeanFTSpin=round(mean(Archer2019FT$release_spin_rate),2)
ArchermeanFTRel=round(mean(Archer2019FT$release_speed),2)
ArchermeanFTSpin
## [1] 2237.17
ArchermeanFTRel
## [1] 93.85
pitchesArcher=c(unique(Archer2019$pitch_type))
pitchesArcher
## [1] "SL" "FF" "CH" "CU" "FT"
spinsArcher=c(ArchermeanSLSpin, ArchermeanFFSpin,ArchermeanCHSpin,ArchermeanCUSpin,ArchermeanFTSpin)
spinsArcher
## [1] 2613.44 2264.25 1641.94 2676.07 2237.17
ReleaseSpeedArcher=c(ArchermeanSLRel, ArchermeanFFRel, ArchermeanCHRel, ArchermeanCURel,ArchermeanFTRel)
ReleaseSpeedArcher
## [1] 88.76 94.09 87.67 82.41 93.85
table1Archer<-data.frame(pitchesArcher,spinsArcher,ReleaseSpeedArcher)
table1Archer
ggplot(data = table1Archer, aes(x=pitchesArcher, y=spinsArcher, fill = ReleaseSpeedArcher)) +
geom_bar(stat = "identity") +
geom_label(aes(x = pitchesArcher, y = spinsArcher, label = spinsArcher), hjust = .5, vjust = 0, colour = "black", fill = NA, label.size = NA, family="Helvetica", size = 4) +
xlab("Pitch Type") +
ylab("Spin Rate (RPM)") +
ggtitle("Chris Archer Avg. Spin Rate and Release Speed by Pitch Type (2019)") +
coord_cartesian(ylim = c(0, 3200))

ggsave("ChrisArcher.png")
## Saving 7 x 5 in image
head(Brault2019)
Brault2019=na.omit(Brault2019)
unique(Brault2019$pitch_type)
## [1] "SL" "FF" "FC" "CH" "FT" "CU"
unique(Brault2019$pitch_name)
## [1] "Slider" "4-Seam Fastball" "Cutter" "Changeup"
## [5] "2-Seam Fastball" "Curveball"
Brault2019SL=Brault2019 %>%filter(pitch_type=="SL")
BraultmeanSLSpin=round(mean(Brault2019SL$release_spin_rate),2)
BraultmeanSLRel=round(mean(Brault2019SL$release_speed),2)
BraultmeanSLSpin
## [1] 2192.17
BraultmeanSLRel
## [1] 81.22
Brault2019FF=Brault2019 %>%filter(pitch_type=="FF")
BraultmeanFFSpin=round(mean(Brault2019FF$release_spin_rate),2)
BraultmeanFFRel=round(mean(Brault2019FF$release_speed),2)
BraultmeanFFSpin
## [1] 2068.36
BraultmeanFFRel
## [1] 92.09
Brault2019FC=Brault2019 %>%filter(pitch_type=="FC")
BraultmeanFCSpin=round(mean(Brault2019FC$release_spin_rate),2)
BraultmeanFCRel=round(mean(Brault2019FC$release_speed),2)
BraultmeanFCSpin
## [1] 2211.08
BraultmeanFCRel
## [1] 83.49
Brault2019CH=Brault2019 %>%filter(pitch_type=="CH")
BraultmeanCHSpin=round(mean(Brault2019CH$release_spin_rate),2)
BraultmeanCHRel=round(mean(Brault2019CH$release_speed),2)
BraultmeanCHSpin
## [1] 1582.26
BraultmeanCHRel
## [1] 84.26
Brault2019FT=Brault2019 %>%filter(pitch_type=="FT")
BraultmeanFTSpin=round(mean(Brault2019FT$release_spin_rate),2)
BraultmeanFTRel=round(mean(Brault2019FT$release_speed),2)
BraultmeanFTSpin
## [1] 1888.13
BraultmeanFTRel
## [1] 91.34
Brault2019CU=Brault2019 %>%filter(pitch_type=="CU")
BraultmeanCUSpin=round(mean(Brault2019CU$release_spin_rate),2)
BraultmeanCURel=round(mean(Brault2019CU$release_speed),2)
BraultmeanCUSpin
## [1] 2031.48
BraultmeanCURel
## [1] 71.06
pitchesBrault=c(unique(Brault2019$pitch_type))
pitchesBrault
## [1] "SL" "FF" "FC" "CH" "FT" "CU"
spinsBrault=c(BraultmeanSLSpin, BraultmeanFFSpin,BraultmeanFCSpin,BraultmeanCHSpin,BraultmeanFTSpin,BraultmeanCUSpin)
spinsBrault
## [1] 2192.17 2068.36 2211.08 1582.26 1888.13 2031.48
ReleaseSpeedBrault=c(BraultmeanSLRel, BraultmeanFFRel, BraultmeanFCRel, BraultmeanCHRel,BraultmeanFTRel,BraultmeanCURel)
ReleaseSpeedBrault
## [1] 81.22 92.09 83.49 84.26 91.34 71.06
table1Brault<-data.frame(pitchesBrault,spinsBrault,ReleaseSpeedBrault)
table1Brault
ggplot(data = table1Brault, aes(x=pitchesBrault, y=spinsBrault, fill = ReleaseSpeedBrault)) +
geom_bar(stat = "identity") +
geom_label(aes(x = pitchesBrault, y = spinsBrault, label = spinsBrault), hjust = .5, vjust = 0, colour = "black", fill = NA, label.size = NA, family="Helvetica", size = 4) +
xlab("Pitch Type") +
ylab("Spin Rate (RPM)") +
ggtitle("Steven Brault Avg. Spin Rate and Release Speed by Pitch Type (2019)") +
coord_cartesian(ylim = c(0, 3200))

ggsave("StevenBrault.png")
## Saving 7 x 5 in image
head(Keller2019)
Keller2019=na.omit(Keller2019)
unique(Keller2019$pitch_type)
## [1] "FF" "SL" "CU" "CH"
unique(Keller2019$pitch_name)
## [1] "4-Seam Fastball" "Slider" "Curveball" "Changeup"
Keller2019FF=Keller2019 %>%filter(pitch_type=="FF")
KellermeanFFSpin=round(mean(Keller2019FF$release_spin_rate),2)
KellermeanFFRel=round(mean(Keller2019FF$release_speed),2)
KellermeanFFSpin
## [1] 2472.93
KellermeanFFRel
## [1] 95.36
Keller2019SL=Keller2019 %>%filter(pitch_type=="SL")
KellermeanSLSpin=round(mean(Keller2019SL$release_spin_rate),2)
KellermeanSLRel=round(mean(Keller2019SL$release_speed),2)
KellermeanSLSpin
## [1] 2661.34
KellermeanSLRel
## [1] 87.66
Keller2019CU=Keller2019 %>%filter(pitch_type=="CU")
KellermeanCUSpin=round(mean(Keller2019CU$release_spin_rate),2)
KellermeanCURel=round(mean(Keller2019CU$release_speed),2)
KellermeanCUSpin
## [1] 2769.73
KellermeanCURel
## [1] 81.11
Keller2019CH=Keller2019 %>%filter(pitch_type=="CH")
KellermeanCHSpin=round(mean(Keller2019CH$release_spin_rate),2)
KellermeanCHRel=round(mean(Keller2019CH$release_speed),2)
KellermeanCHSpin
## [1] 1704.61
KellermeanCHRel
## [1] 91.02
pitchesKeller=c(unique(Keller2019$pitch_type))
pitchesKeller
## [1] "FF" "SL" "CU" "CH"
spinsKeller=c(KellermeanFFSpin, KellermeanSLSpin,KellermeanCUSpin,KellermeanCHSpin)
spinsKeller
## [1] 2472.93 2661.34 2769.73 1704.61
ReleaseSpeedKeller=c(KellermeanFFRel, KellermeanSLRel, KellermeanCURel, KellermeanCHRel)
ReleaseSpeedKeller
## [1] 95.36 87.66 81.11 91.02
table1Keller<-data.frame(pitchesKeller,spinsKeller,ReleaseSpeedKeller)
table1Keller
ggplot(data = table1Keller, aes(x=pitchesKeller, y=spinsKeller, fill = ReleaseSpeedKeller)) +
geom_bar(stat = "identity") +
geom_label(aes(x = pitchesKeller, y = spinsKeller, label = spinsKeller), hjust = .5, vjust = 0, colour = "black", fill = NA, label.size = NA, family="Helvetica", size = 4) +
xlab("Pitch Type") +
ylab("Spin Rate (RPM)") +
ggtitle("Mitch Keller Avg. Spin Rate and Release Speed by Pitch Type (2019)") +
coord_cartesian(ylim = c(0, 3200))

ggsave("MitchKeller.png")
## Saving 7 x 5 in image
PiratesPitchers=rbind(Williams, Musgrove, Archer, Brault, Keller)
PiratesPitchers